package com.asm.service;

import com.asm.dto.PageResult;
import com.asm.entity.sys.Spot;
import com.asm.repository.SpotRepository;
import com.asm.util.SnowflakeIdWorker;
import com.asm.vo.sys.SpotVo;
import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author ZhuangGuiMan
 */
@Service
public class SpotService {
    @Resource
    private SpotRepository spotRepository;
    @Resource
    private SnowflakeIdWorker snowflakeIdWorker;

    /**
     * 获取广告位列表
     *
     * @param page 页面对象
     * @return 广告位列表
     */
    private List<SpotVo> getSpotVoList(Page<Spot> page) {
        List<SpotVo> list = new ArrayList<>();
        for (Spot spot : page.getContent()) {
            SpotVo spotVo = new SpotVo();
            BeanUtils.copyProperties(spot, spotVo);
            list.add(spotVo);
        }
        return list;
    }

    /**
     * 分页查询所有广告位
     *
     * @param pageNumber 当前页码
     * @param pageSize   页面大小
     * @return 分页形式的广告位列表
     */
    public PageResult<SpotVo> findAllSpots(Integer pageNumber, Integer pageSize) {
        Page<Spot> page = spotRepository.findAll(PageRequest.of(pageNumber, pageSize));
        return new PageResult<>(pageNumber, pageSize, page.getTotalPages(), getSpotVoList(page));
    }

    /**
     * 根据id查询广告位
     *
     * @param id 广告位编号
     * @return 广告位
     */
    public SpotVo findSpotById(Long id) {
        Spot spot = spotRepository.findById(id).get();
        SpotVo spotVo = new SpotVo();
        BeanUtils.copyProperties(spot, spotVo);
        return spotVo;
    }

    /**
     * 根据广告位类型分页查询广告位
     *
     * @param type       广告位类型
     * @param pageNumber 当前页码
     * @param pageSize   页面大小
     * @return 分页形式的广告位列表
     */
    public PageResult<SpotVo> findSpotByType(String type, Integer pageNumber, Integer pageSize) {
        Pageable page = PageRequest.of(pageNumber, pageSize);
        Page<Spot> spots = spotRepository.findBySpotType(type, page);
        return new PageResult<>(pageNumber, pageSize, spots.getTotalPages(), getSpotVoList(spots));
    }

    /**
     * 根据广告位大小分页查询广告位
     *
     * @param size       广告位大小
     * @param pageNumber 当前页码
     * @param pageSize   页面大小
     * @return 分页形式的广告位列表
     */
    public PageResult<SpotVo> findSpotBySize(String size, Integer pageNumber, Integer pageSize) {
        Pageable page = PageRequest.of(pageNumber, pageSize);
        Page<Spot> spots = spotRepository.findBySpotSize(size, page);
        return new PageResult<>(pageNumber, pageSize, spots.getTotalPages(), getSpotVoList(spots));
    }

    /**
     * 添加广告位
     *
     * @param spotVo 广告位
     */
    @Transactional(rollbackFor = Exception.class)
    public void addSpot(SpotVo spotVo) {
        Spot spot = new Spot();
        BeanUtils.copyProperties(spotVo, spot);
        spot.setId(snowflakeIdWorker.nextId());
        spot.setCreateBy(1L);
        spot.setCreateAt(new Date());
        spot.setUpdateBy(1L);
        spot.setUpdateAt(new Date());
        spotRepository.save(spot);
    }

    /**
     * 更新广告位
     *
     * @param spotVo 广告位
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateSpot(SpotVo spotVo) {
        Spot spot = spotRepository.findById(spotVo.getId()).get();
        BeanUtils.copyProperties(spotVo, spot);
        spot.setUpdateBy(1L);
        spot.setUpdateAt(new Date());
        spotRepository.save(spot);
    }

    /**
     * 根据Id删除广告位
     *
     * @param id 广告位编号
     */
    @Transactional(rollbackFor = Exception.class)
    public void deleteSpot(Long id) {
        spotRepository.deleteById(id);
    }

}
